//
//  DispatchGroupDemo.h
//  GCDDemo
//
//  Created by kingboyrang on 2021/10/30.
//  Copyright © 2021 wulanzhou. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 dispatch_group:队列组
 
 有时候我们会有这样的需求：分别异步执行2个耗时任务，然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组。

 调用队列组的 dispatch_group_async 先把任务放到队列中，然后将队列放入队列组中。或者使用队列组的 dispatch_group_enter、dispatch_group_leave 组合来实现 dispatch_group_async。
 调用队列组的 dispatch_group_notify 回到指定线程执行任务。或者使用 dispatch_group_wait 回到当前线程继续向下执行（会阻塞当前线程）

dispatch_group_wait:   暂停当前线程（阻塞当前线程），等待指定的 group 中的任务执行完成后，才会往下继续执行。
dispatch_group_notify: 监听 group 中任务的完成状态，当所有的任务都执行完成后，才会执行dispatch_group_notify中的block方法
 */
@interface DispatchGroupDemo : NSObject

/**
 dispatch_group_async使用
 
 dispatch_group_notify:当所有任务都执行完成之后，才执行 dispatch_group_notify 相关 block 中的任务。
 */
-(void)queueGroup1;

/**
 dispatch_group_wait:暂停当前线程（阻塞当前线程），等待指定的 group 中的任务执行完成后，才会往下继续执行
 */
-(void)queueGroup2;

/**
 dispatch_group_enter:标志着一个任务追加到 group，执行一次，相当于 group 中未执行完毕任务数 +1
 dispatch_group_leave:标志着一个任务离开了 group，执行一次，相当于 group 中未执行完毕任务数 -1。
 
 dispatch_group_enter+dispatch_group_leavex结合 = dispatch_group_async
 
 当 group 中未执行完毕任务数为0的时候，才会使 dispatch_group_wait 解除阻塞，以及执行追加到 dispatch_group_notify 中的任务。
 */
-(void)queueGroup3;

/**
 dispatch_group_wait与dispatch_group_notify结合使用
 说明：A、B、C、D四个线程，A、B执行完成后才执行C、D，然后回主线程操作
 */
-(void)queueGroup4;

@end

NS_ASSUME_NONNULL_END
